tcola * crearcola(int identif)
{
	key_t clave;
	tcola *cola;
	char mensaje[150];

	clave = ftok(DIRECTORIO, identif);
	if(clave == -1)
	{
		perror("crearcola");
		return NULL;
	}

	cola = (tcola*) malloc (sizeof(tcola));				/* Aloco la memoria necesaria para la struct de la cola */
	if(cola == NULL)
	{
		strcpy(mensaje, "crearcola: malloc error\n");
		write(fileno(stdout), mensaje, strlen(mensaje));
		return NULL;
	}

	cola->id = msgget(clave, 0666 | IPC_CREAT);			/* Creo que la cola */
	if(cola->id == -1)
	{
		free(cola);						/* Deallocates the space pointed */
		perror("cola_crear");
		return NULL;
	}
	
	return cola;
}

int enviarcola(tcola *cola, void *datos, size_t size)
{
	char mensaje[150];

	if (!cola)							/* Si no existe la cola devuelve error */
	{
		strcpy(mensaje, "enviarcola: no existe la cola\n");
		write(STDERR_FILENO,cadena,strlen(cadena));
		return -1;		
	}

	if (!mensaje)							/* Verifica si hay datos */
	{
		strcpy(cadena,"enviarcola: no hay datos\n");
		write(STDERR_FILENO,cadena,strlen(cadena));
		return -1;		
	}

	if (msgsnd(cola->id, mensaje, size - sizeof(long), 0) == -1)
	{
		perror("enviarcola msgsnd");
		return -1;
	}

	return 0;
}

/*
	msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg);

	The argument msgflg specifies the action to be taken if a message of the desired
	type is not on the queue. These are as follows:
    		* If (msgflg & IPC_NOWAIT) is non-zero, the calling thread will return
    		  immediately with a return value of -1 and errno set to [ENOMSG].
    		* If (msgflg & IPC_NOWAIT) is 0, the calling thread will suspend
    		  execution until one of the following occurs:
			- A message of the desired type is placed on the queue.
			- The message queue identifier msqid is removed from the system;
			  when this occurs, errno is set equal to [EIDRM] and -1 is returned.
			- The calling thread receives a signal that is to be caught; in this case
			  a message is not received and the calling thread resumes execution in
			  the manner prescribed in sigaction(). 
*/
int recibircola(tcola *cola, void *datos, size_t size, long tipo)
{
		char mensaje[150];

		if ( !cola )
		{
			strcpy(mensaje, "recibircola: no existe la cola\n");
			write(fileno(stdout), mensaje, strlen(mensaje));
			return -1;		
		}

		if ( !datos ) 
		{
			strcpy(mensaje, "recibircola: no hay mensaje\n");
			write(fileno(stdout), mensaje, strlen(mensaje));
			return -1;		
		}

		if( msgrcv(cola->id, datos, size - sizeof(long), tipo, 1) == -1 )
		{
			perror("recibircola msgrcv");
			return -1;
		}

		return 0;
}

int elimcola(tcola *cola)
{
	char mensaje[150];			
	
	if ( !cola ) 
	{
		strcpy(mensaje, "elicola: no existe la cola\n");
		write(fileno(stdout), mensaje, strlen(mensaje));
		return -1;		
	}

	if( msgctl(cola->id, IPC_RMID, (struct msqid_ds *) NULL) == -1 )
	{
		perror("elicola msgctl");
		return -1;
	}

	free(cola);

	return 0;
}
